package springboot.netty;

import com.alibaba.fastjson.JSON;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.ReferenceCountUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.client.RestTemplate;
import springboot.bean.Status;
import springboot.http.HttpClientTools;
import springboot.tools.ConvertByteToBit;
import springboot.tools.KernelTools;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 只有一个地方能更新数据库,异步更新数据库会出现问题
 */
@Slf4j
public class SimpleServerHandler extends ChannelInboundHandlerAdapter {
    /*agv是否有任务在身*/
    public static boolean HAVING_TASK = false;
    /*任务是否创建*/
    public static boolean TASK_A_TO_C=false;
    public static boolean TASK_A_TO_D=false;
    public static boolean TASK_B_TO_C=false;
    public static boolean TASK_B_TO_D=false;
    public int i=0;
    int a=0;
    int b=0;
    int c=0;
    int d=0;

    ConvertByteToBit convertByteToBit=new ConvertByteToBit();

    KernelTools kernelTools=new KernelTools();
    /*接收的数据,直接用全局变量*/
    byte[] byteFromPLc4 = new byte[8];
    byte[] byteFromPLc5 = new byte[8];
    byte[] byteFromPLc6 = new byte[8];
    byte[] byteFromPLc7 = new byte[8];
    byte[] byteFromPLc8 = new byte[8];
    Status status=new Status();
    /*发送的数据,直接用全局的变量*/
    public static byte[] data = new byte[7];
    public static List<Channel> channels = new ArrayList<>();

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        Channel inChannel=ctx.channel();
        if(channels.size()==0){//如果没有连接就进行连接就对了
            channels.add(inChannel);
            System.out.println("=== " + ctx.channel().remoteAddress() + " is active ===");
        }
    }


    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws InterruptedException, IOException {
        ByteBuf buf = (ByteBuf) msg;
        byte[] bytes = new byte[buf.readableBytes()];
        buf.readBytes(bytes);
        /*没有任务在进行中,并且校验通过*/
        if (bytes.length==11){
            if (bytes[0]==2&&bytes[1]==7&&bytes[2]==71&&bytes[10]==3){
                /*将获取到的数据传输到数组中*/
                byteFromPLc4=convertByteToBit.byteToBit((byte)bytes[4]);
                byteFromPLc5=convertByteToBit.byteToBit((byte)bytes[5]);
                byteFromPLc6=convertByteToBit.byteToBit((byte)bytes[6]);
                byteFromPLc7=convertByteToBit.byteToBit((byte)bytes[7]);
                byteFromPLc8=convertByteToBit.byteToBit((byte)bytes[8]);
                /*直接更新数据库,看一下数据库里面有没有正在使用的货位*/
                status.setByteFromPLc6(byteFromPLc6);
                status.setByteFromPLc7(byteFromPLc7);
                status.setByteFromPLc8(byteFromPLc8);
                String ouput= JSON.toJSONString(status);
                HttpClientTools.sendPostDataByJson("http://localhost:9998/updateStack",ouput,"utf-8");
                /*创建任务轮询,一次进入只能创建一个任务,一个轮着一个来*/
                /*A区的任务,读取数据库的内容来判断,并且不能让两个灯亮着*/
                //两个按钮同时按时,没有任务就让该任务去随机的一个
                if (byteFromPLc4[0] == 1 && byteFromPLc4[1]==1 && byteFromPLc4[2]==1){
                    if (!TASK_A_TO_C && !TASK_A_TO_D){//没有任何任务才能去接任务
                        /*数据库查询返回能去往的终点*/
                        String end=HttpClientTools.sendGetData("http://localhost:9998/getStackToC","utf-8");
                        if (!end.equals("NO")){
                            kernelTools.CreateOrderOneStation("1024",end);
                            /*更改状态*/
                            HttpClientTools.sendGetData("http://localhost:9998/updateStackByEnd/"+end,"utf-8");
                            TASK_A_TO_C=true;
                        }else{
                            String target=HttpClientTools.sendGetData("http://localhost:9998/getStackToD","utf-8");
                            if (!target.equals("NO")){
                                kernelTools.CreateOrderOneStation("1024",target);
                                /*更改状态*/
                                HttpClientTools.sendGetData("http://localhost:9998/updateStackByEnd/"+target,"utf-8");
                                TASK_A_TO_D=true;
                            }
                        }
                    }
                }else if(byteFromPLc4[0] == 1 && byteFromPLc4[1]==1){//按往去C区的
                    if (!TASK_A_TO_C && !TASK_A_TO_D){//没有任何任务才能去接任务
                        /*数据库查询返回能去往的终点*/
                        String end=HttpClientTools.sendGetData("http://localhost:9998/getStackToC","utf-8");
                        if (!end.equals("NO")){
                            kernelTools.CreateOrderOneStation("1024",end);
                            /*更改状态*/
                            HttpClientTools.sendGetData("http://localhost:9998/updateStackByEnd/"+end,"utf-8");
                            TASK_A_TO_C=true;
                        }
                    }
                }else if(byteFromPLc4[0] == 1 && byteFromPLc4[2]==1){//按往去D区的
                    if (!TASK_A_TO_C && !TASK_A_TO_D){//没有任何任务才能去接任务
                        /*数据库查询返回能去往的终点*/
                        String end=HttpClientTools.sendGetData("http://localhost:9998/getStackToD","utf-8");
                        if (!end.equals("NO")){
                            kernelTools.CreateOrderOneStation("1024",end);
                            /*更改状态*/
                            HttpClientTools.sendGetData("http://localhost:9998/updateStackByEnd/"+end,"utf-8");
                            TASK_A_TO_D=true;
                        }
                    }
                }
                /*B区的任务*/
                if (byteFromPLc5[0] == 1 && byteFromPLc5[1]==1 && byteFromPLc5[2]==1){
                    if (!TASK_B_TO_C && !TASK_B_TO_D){//没有任何任务才能去接任务
                        /*数据库查询返回能去往的终点*/
                        String end=HttpClientTools.sendGetData("http://localhost:9998/getStackToC","utf-8");
                        log.info("end的值为={}",end);
                        if (!end.equals("NO")){
                            kernelTools.CreateOrderOneStation("1026",end);
                            /*更改状态*/
                            HttpClientTools.sendGetData("http://localhost:9998/updateStackByEnd/"+end,"utf-8");
                            TASK_B_TO_C=true;
                        }else{
                            String target=HttpClientTools.sendGetData("http://localhost:9998/getStackToD","utf-8");
                            if (!target.equals("NO")){
                                kernelTools.CreateOrderOneStation("1026",target);
                                /*更改状态*/
                                HttpClientTools.sendGetData("http://localhost:9998/updateStackByEnd/"+target,"utf-8");
                                TASK_B_TO_D=true;
                            }
                        }
                    }
                }else if(byteFromPLc5[0] == 1 && byteFromPLc5[1]==1){//按往去C区的
                    if (!TASK_B_TO_C && !TASK_B_TO_D){//没有任何任务才能去接任务
                        /*数据库查询返回能去往的终点*/
                        String end=HttpClientTools.sendGetData("http://localhost:9998/getStackToC","utf-8");
                        if (!end.equals("NO")){
                            kernelTools.CreateOrderOneStation("1026",end);
                            /*更改状态*/
                            HttpClientTools.sendGetData("http://localhost:9998/updateStackByEnd/"+end,"utf-8");
                            TASK_B_TO_C=true;
                        }
                    }
                }else if(byteFromPLc5[0] == 1 && byteFromPLc5[2]==1){//按往去D区的
                    if (!TASK_B_TO_C && !TASK_B_TO_D){//没有任何任务才能去接任务
                        /*数据库查询返回能去往的终点*/
                        String end=HttpClientTools.sendGetData("http://localhost:9998/getStackToD","utf-8");
                        if (!end.equals("NO")){
                            kernelTools.CreateOrderOneStation("1026",end);
                            /*更改状态*/
                            HttpClientTools.sendGetData("http://localhost:9998/updateStackByEnd/"+end,"utf-8");
                            TASK_B_TO_D=true;
                        }
                    }
                }

            }
        }

        //Manual recycling to prevent memory leakage;
        ReferenceCountUtil.release(buf);


        /**
         * 报文发送数据
         */
        data[0] = 2;//报文头
        data[1] = 3;//有效的数据长度
        data[2] = 86;//标志位
        data[3]= (byte) (data[3]+1);//data[3]作为心跳存在
        data[5] = 0;//和校验
        data[6] = 3;//报文尾
        //A-C类任务反馈  data[4]=1;
        if(TASK_A_TO_C&&a==0){
            data[4]= (byte)(data[4]+1);
            a=1;
        }
        //A-D类任务反馈  data[4]=2;
        if(TASK_A_TO_D&&b==0){
            data[4]=(byte)(data[4]+2);
            b=1;
        }
        //B-C类任务反馈  data[4]=4;
        if(TASK_B_TO_C&&c==0){
            data[4]=(byte)(data[4]+4);
            c=1;
        }
        //B-D类任务反馈  data[4]=8;
        if(TASK_B_TO_D&&d==0){
            data[4]=(byte)(data[4]+8);
            d=1;
        }
        //A-C类任务反馈  data[4]=1;
        if(!TASK_A_TO_C&&a==1){
            data[4]= (byte)(data[4]-1);
            a=0;
        }
        //A-D类任务反馈  data[4]=2;
        if(!TASK_A_TO_D&&b==1){
            data[4]=(byte)(data[4]-2);
            b=0;
        }
        //B-C类任务反馈  data[4]=4;
        if(!TASK_B_TO_C&&c==1){
            data[4]=(byte)(data[4]-4);
            c=0;
        }
        //B-D类任务反馈  data[4]=8;
        if(!TASK_B_TO_D&&d==1){
            data[4]=(byte)(data[4]-8);
            d=0;
        }
        ByteBuf json = Unpooled.wrappedBuffer(data);

        ctx.writeAndFlush(json);
    }
}
